'use strict';

const Controller = require('egg').Controller;

/**
 * 部门管理控制器
 * 处理部门的增删改查等功能
 */
class DepartmentController extends Controller {
  /**
   * 获取部门列表
   * 返回所有未删除的部门，按排序值升序
   */
  async list() {
    const { ctx } = this;
    const departments = await ctx.service.department.findAll();
    ctx.body = departments;
  }

  /**
   * 创建新部门
   * @param {Object} ctx.request.body
   * @param {string} ctx.request.body.department_name - 部门名称
   * @param {number} [ctx.request.body.sort] - 排序值
   * @throws {422} 部门名称已存在时抛出异常
   */
  async create() {
    const { ctx } = this;
    ctx.validate({
      department_name: { type: 'string', required: true },
      sort: { type: 'number', required: false },
    });

    const result = await ctx.service.department.create(ctx.request.body);
    if (!result) {
      ctx.throw(422, '部门名称已存在');
    }
    ctx.body = result;
  }

  /**
   * 更新部门信息
   * @param {Object} ctx.request.body
   * @param {number} ctx.request.body.department_id - 部门ID
   * @param {string} ctx.request.body.department_name - 部门名称
   * @param {number} [ctx.request.body.sort] - 排序值
   * @throws {404} 部门不存在时抛出异常
   * @throws {422} 部门名称已存在时抛出异常
   */
  async update() {
    const { ctx } = this;
    ctx.validate({
      department_id: { type: 'number', required: true },
      department_name: { type: 'string', required: true },
      sort: { type: 'number', required: false },
    });

    const result = await ctx.service.department.update(
      ctx.request.body.department_id,
      ctx.request.body
    );

    if (!result) {
      ctx.throw(404, '未找到该部门');
    }
    if (result.error === 'duplicate_name') {
      ctx.throw(422, '部门名称已存在');
    }

    ctx.body = result;
  }

  /**
   * 删除部门
   * @param {Object} ctx.request.body
   * @param {number} ctx.request.body.department_id - 部门ID
   * @throws {404} 部门不存在时抛出异常
   * @throws {422} 部门下有人员时抛出异常
   */
  async delete() {
    const { ctx } = this;
    ctx.validate({
      department_id: { type: 'number', required: true },
    });

    const result = await ctx.service.department.delete(ctx.request.body.department_id);
    if (!result) {
      ctx.throw(404, '未找到该部门');
    }
    if (result.error === 'has_persons') {
      ctx.throw(422, '该部门下存在人员，无法删除');
    }
    ctx.body = result;
  }
}

module.exports = DepartmentController;